package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * 标准流：IO流处理异常对象
 *
 * 高级流：BufferedOutputStream 缓冲输出流 写     bos.txt
 *       BufferedInputStream 缓冲输入流  读入
 */
public class IOSAPI {
    /**
     * 缓冲输入流：构造器-->异常对象
     *
     * 缓冲输入流：具备功能：合理传输数据 效率提高
     * 构造器具备：添加字符集：UTF8万国码
     * new BufferedOutputStream(低级流引用，size：存字节数组【指定】)
     * 问题1：不能指定字符集
     * 问题2：不能按照字符读取
     */
    @Test
    public void testBIS(){}
        /**
         * 高级流
         * 针对缓冲输出|入功能上的限定---传输：文本
         *
         * 字符流【转换流】---解决：缓冲输入流读取单位 为字节问题
         * InputStreamReader 读取单位：字符
         * OutputStreamRWriter 写出单位：字符 调用字符串getBytes写出文本
         * 需求：重新写流---针对：文字  写出文本：osw.txt
         */
        @Test
    public void testOSW() throws IOException {
            //标准流：1.置空流
            FileOutputStream fos=null;
            OutputStreamWriter osw=null;
            //标准流：2.捕获异常
            try {
                //创建低级流
                fos=new FileOutputStream("osw.txt");
                //不考虑效率---只传输文本---字符输出流：输出单位字符形式
                //字符流：都可以在第二个参数指定编码集
                osw=new OutputStreamWriter(fos,"UTF8");
                //write() 直接写出文本【不需要将文本转换成字节数组】
                osw.write("给老铁来个双击");
                osw.write("666\n");//换行：字符 char
                osw.write("777");
            } catch (FileNotFoundException e){//文件不存在
                e.printStackTrace();
            }catch (UnsupportedEncodingException e){//字符集转换异常
                e.printStackTrace();
            } catch (IOException e) {//IO流异常：所有传输失败总异常
                e.printStackTrace();
            } finally {
                //关闭高级流：字符输出流
                try {
                    if (osw!=null){
                        osw.close();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        @Test
        /**
         * 高级流【处理流】---转换流【字符流】，特点：套在低级流上，被其他高级流套上【传输数据】
         * 字符输入流 --- 单元测试：testISR()  读入  文本【字符串】？
         * 字符输出流 --- 单元测试：testOSW()   写出  文本【字符串】
         * InputStreamReader  字符输入流  不可以读文本
         *
         * 高级流【处理流】---转换流【字符流】---缓冲字符流：解决读入、写出都是字符形式
         * BufferedReader 缓冲字符输入流---解决：InputStreamReader读入字节形式
         *                                   BufferedReader读入字符形式
         *BufferedWriter
         * 需求：ISR字符输入流读取osw.txt 文件 ？？
         *        ①当前代码转换为标准流IO：捕获所有异常
         *        ②读取每行文本？ readLine() 提示：不为null代表文本写出
         *        写出：.......   参考：CV复制粘贴
         */
    public void testISR() throws IOException {
            //创建低级流
            FileInputStream fis=new FileInputStream("osw.txt");
            //创建高级流---转换流--字符输入流,目的：指定编码集：--UTF8
            InputStreamReader isr=new InputStreamReader(fis,"UTf8");
            //读  read() 问题：读入数据单位：字节，而不是字符，读字符
            //                转换流----套高级流：缓冲字符输入/出流
            //创建高级流---针对转换流中：字符输入流无法读取形式：字符的情况---缓冲字符输入流
            BufferedReader br=new BufferedReader(isr);
            /**
             * BufferedReader类
             * readLine()读入若干字符串，直到读到没有换行符为止
             */
            //接收输出字符串
            String line=null;
            //判断条件：文本中一直有内容，一直读 一行文本br.readLine()
            while((line=br.readLine())!=null){
                System.out.println("打印读到字符串："+line);
            }
        }
    /**
     * 作业2：读取IOSAPI.java文件----所有代码--写出控制台
     */
    @Test
    public void testHomeWork2() throws IOException {
        FileInputStream yi=new FileInputStream("src\\main\\java\\com\\tedu\\api\\io");
        InputStreamReader er=new InputStreamReader(yi,"UTF8");
        BufferedReader san= new BufferedReader(er);
        String line=null;
        while((line= san.readLine())!=null){
            System.out.println("读取所有："+line);
        }
        san.close();
    }

    /**高级流
     * BufferedWriter---低配版本输出流【缓冲输出流】
     * PrintWriter---高配版输出流【字符输出流】
     * 1.高级流不能直接创建---直接创建【不需要创建低级流】---封装
     * 2.内存所有流的特点
     */
    @Test
    public void testPW() throws FileNotFoundException, UnsupportedEncodingException {
        //低级流：输出流
        FileOutputStream fos=new FileOutputStream("pw.txt");
        //高级流：转换流，功能：指定编码集
        OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF8");
        //高级流：缓冲流，功能：提高效率
        BufferedWriter bw=new BufferedWriter(osw);
        //创建高级流：低级流：输出流+转换流+缓冲流
        PrintWriter pw=new PrintWriter(bw);
        //写出功能：print（）打印一行文本 不换行
        //        println（）打印一行文本 换行
        pw.print("你就是");
        pw.println("我的小可爱~");
        pw.close();
    }
}
